/*
 * FileWritter.cpp
 *
 *  Created on: Jun 27, 2014
 *      Author: carlos
 */

#include "FileWritter.h"

FileWritter::FileWritter(string path) :
		path(path) {
	archivo.open(path.c_str(), std::ios::out | std::ios::binary);
	archivo.close();
	this->isBuffring=false;
	this->bitsContIntbuffer=0;
	/* reabre el archivo para lectura - escritura binario */
	archivo.open(path.c_str(), std::ios::in | std::ios::out | std::ios::binary);
}

void FileWritter::writeByte2(unsigned char byte2) {
	//paso todos los que puedo al buffer
	int cantBitsDisponiblesBuffer = 8 - this->bitsContIntbuffer;
	unsigned char bitsApasar;
	bitsApasar = byte2 >> (this->bitsContIntbuffer);
	this->mycharBuffer |= bitsApasar;
	byte2 <<= cantBitsDisponiblesBuffer;
	bitsApasar = byte2;
	archivo << mycharBuffer;
	mycharBuffer = byte2;
	this->bitsContIntbuffer = 8 - cantBitsDisponiblesBuffer;
	this->isBuffring = (this->bitsContIntbuffer > 0);
}

void FileWritter::write(unsigned int code,int tableSize) {
	unsigned short value=code;
	int cantidadBits=tableSize<=8?9:tableSize;//hacemos la mas facil
	//value<<=(16-cantidadBits);
	unsigned char byte2=value & 0xff;
	unsigned char byte1=value>>8 & 0xff;


	if(cantidadBits<=8){
		if(this->isBuffring){
			//paso todos los que puedo al buffer
			writeByte2(byte2);
		}else{
			archivo<<byte2;
		}
	}else{

		if(this->isBuffring){
			int cantbitsDisponiblesEnbuffer=8-this->bitsContIntbuffer;
			int cantBitsApasar=(cantidadBits-8);
			unsigned char bitsApasar;

			byte1<<=16-cantidadBits;//alineo a iza
			bitsApasar=byte1>>(this->bitsContIntbuffer);//me no voy a poder pasar this->cantBitInBuffer
			this->mycharBuffer|=bitsApasar;
			byte1<<=cantbitsDisponiblesEnbuffer; //descarto los bits que ya pase
			//this->bitsContIntbuffer+=8-this->bitsContIntbuffer;
			//contamos si quedaron bits por pasar en el byte1
			if(cantbitsDisponiblesEnbuffer>cantidadBits-8){
				this->bitsContIntbuffer+=(cantidadBits-8); //los pasamos todos
			}else{
				this->bitsContIntbuffer=8;
				archivo<<mycharBuffer;
				mycharBuffer=byte1;//copio por si quedaron bits
				this->bitsContIntbuffer=cantidadBits-8-cantbitsDisponiblesEnbuffer;
			}
			this->writeByte2(byte2);

		}else{
			byte1<<=16-cantidadBits;
			byte1|=(byte2>>(cantidadBits-8));
			byte2<<=(8-(cantidadBits-8));///coro os bits que pase
			archivo<<byte1;
			this->mycharBuffer=byte2;
			this->bitsContIntbuffer=(cantidadBits-8);
			this->isBuffring=(bitsContIntbuffer>0);
		}
	}


}

void FileWritter::close() {
	if (archivo.is_open()) {
		if(this->isBuffring){
			archivo<<this->mycharBuffer;
		}
		archivo.close();
	}
}
FileWritter::~FileWritter() {
	this->close();
}

